#include <iostream>
#include <cstring>
#include <algorithm>
#include <time.h>
#define random(x) (rand()%x)


struct Student {
    char id[15];            // 准考证号
    int score;              // 分数
    int location_number;    // 考场号
    int local_rank;         // 考场内排名
}stu[30010];

bool cmp(Student a, Student b) {
    if(a.score != b.score) return a.score >  b.score;
    return strcmp(a.id, b.id) < 0; //比较字符串字母排序,a.id小于b.id返回负数，否则返回正数,相等返回0
}

void rank()
{
    int n,num=0; // num为总人数
    printf("input the total locations number : \n");
    //scanf("%d", &n); // n为考场总数 n为正数
    n=2;
    srand((unsigned int)(time(NULL))); //随机数种子
    for(int i=1; i<=n; i++) {
        int k; // k为该考场人数
        printf("input the total students number : \n");
        //scanf("%d", &k); // k为该考场人数 k为正数
        k=5;
        //考生信息录入
        for(int j=0; j<k; j++) {
            printf("input each statudent's id and score: \n");
            //scanf("%s %d",&stu[num].id, &stu[num].score);
            strcpy(stu[num].id,"12345678900000");
            stu[num].score = random(100); // 100以内随机数
            stu[num].location_number = i; // 同一考场的考生考场号相同
            num++;
        }
        //同一考场内排序
        //数组stu在stu+num-k到stu+num范围内共k个人排名
        // +num是因为有多个考场，每个考场学生在stu下标起始位置由num决定
        std::sort(stu+num-k, stu+num,cmp);
        //记录考场内的排名
        //首先将该考场第一名标记为1 , 该考场第一个考生数组下标为 num-k
        stu[num-k].local_rank = 1;
        //对随后的k-1个考生记录排名，若与前一个分数相同，则排名相同，后面分数不同的人排名加1
        for(int j= num-k+1; j<num; j++) {
            if(stu[j].score == stu[j-1].score) stu[j].local_rank = stu[j-1].local_rank;
            //else stu[j].local_rank = stu[j-1].local_rank + 1;
            else stu[j].local_rank = j - (num-k) + 1; // 排名为j前面的人数
        }
    }

    // 一边输出结果一边做总排名
    printf("%d\n", num); //总考生数
    std::sort(stu,stu+num,cmp); //全体考生排名
    //记录全体考生的总排名
    int r = 1;
    for(int i=0; i<num; i++) {
        if(i>0 && stu[i].score != stu[i-1].score) {
            //r += 1;
            r = i+1; //与上一考生分数不同时，当前考生排名更新为前面的人数
        }
        printf("%s %d ",stu[i].id,stu[i].score);
        printf("%d %d %d\n", r, stu[i].location_number, stu[i].local_rank);
    }
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    rank();
    return 0;
}